library(elsasserlib)
library(ggpubr)
library(reshape)
library(dplyr)
library(ggrepel)
tbl <- read.table('Kumar_2020_master_gene_table_rnaseq_shrunk_plus_annotations.tsv',sep = "\t",header = T)
tbl <- tbl[!duplicated(tbl$name),]
tbl$sig_Ni_EZH2i_up <- (tbl$RNASeq_DS_EZH2i_vs_Ni_log2FoldChange > 0) & (tbl$RNASeq_DS_EZH2i_vs_Ni_padj < 0.05)
tbl$sig_Ni_EZH2i_down <- (tbl$RNASeq_DS_EZH2i_vs_Ni_log2FoldChange < -0) & (tbl$RNASeq_DS_EZH2i_vs_Ni_padj < 0.05)
tbl$Lanner_germlayer[tbl$name %in% c("MSX2")] <- "EarlyTE"
tbl$Lanner_germlayer[tbl$name %in% c("GATA2","GATA3","KRT7","XAGE2","NUAK2","EPAS1")] <- "TE"
tbl$Lanner_germlayer[tbl$name %in% c("VGLL1","CGB5")] <- "CTB"
tbl$Lanner_germlayer[tbl$name %in% c("SLC40A1","SDC1","CLDN4")] <- "STB"
tbl$sig_summary <- "ns"
tbl$sig_summary[tbl$sig_Ni_EZH2i_up] <- "Ni_EZH2i_up"
tbl$sig_summary[tbl$sig_Ni_EZH2i_down] <- "Ni_EZH2i_down"
lanner.set <- select(tbl[tbl$Lanner_germlayer != "None",], "name","Lanner_germlayer","sig_summary", contains("Log2FoldChange") & contains("RNASeq") )
lanner.set$Lanner_germlayer <- factor(lanner.set$Lanner_germlayer, levels= c("EightCells","Morula","ICM","EarlyBlastocyst","Early","EarlyEpi","Early/Mid Epi","MidEpi","LateEpi","PE","EarlyTE","TE","LateTE","CTB","STB","EVT","Amnion","YsMes","AxMes","AdvMes","NasMes","EmMes","Endoderm","PriS")
)
goi <- c("GATA3","GATA2","CDX2","TP63","CGA","CGB","CGB5","POU5F1","DPPA3","VGLL1","BMP4","VIM","DPPA2","NANOG","SOX2","KRT19","FGF4","TFAP2A","KRT7","ENPEP","IGF2","FRZB","ERP27","KRT23","DNMT3A","DNMT3L","XAGE2","HAND1","KRT18","KLF6","NUAK2","EPAS1","MSX2", "SDC1", "SLC40A1","CLDN4")
ggstripchart(lanner.set,x="Lanner_germlayer",y="RNASeq_DS_EZH2i_vs_Ni_log2FoldChange",
orientation="horizontal",
color = "sig_summary",
palette=c("#88AAFF","#EE8844","#DDDDDD"),
size = 1, jitter=0.2,
ggtheme=theme_bw(),
label="name", font.label = list(size = 7), repel=T, label.select = goi , label.rectangle = F) + scale_x_discrete(limits=rev)

ggsave("lanner_germlayer_naive_strip.pdf")
Saving 6 x 6 in image
ggstripchart(lanner.set,x="Lanner_germlayer",y="RNASeq_DS_EZH2i_vs_Pr_log2FoldChange",
orientation="horizontal",
color = "sig_summary",
palette=c("#88AAFF","#EE8844","#DDDDDD"),
size = 1, jitter=0.2,
ggtheme=theme_bw(),
label="name", font.label = list(size = 7), repel=T, label.select = goi , label.rectangle = F) + scale_x_discrete(limits=rev)

ggsave("lanner_germlayer_primed_strip.pdf")
Saving 12 x 12 in image
ggstripchart(lanner.set,x="Lanner_germlayer",y="RNASeq_DS_Pr_vs_Ni_log2FoldChange",
orientation="horizontal",
color = "sig_summary",
palette=c("#88AAFF","#EE8844","#DDDDDD"),
size = 1, jitter=0.2,
ggtheme=theme_bw(),
label="name", font.label = list(size = 7), repel=T, label.select = goi , label.rectangle = F) + scale_x_discrete(limits=rev)

ggsave("lanner_germlayer_ni_vs_pr_strip.pdf")
Saving 12 x 12 in image
tbl <- read.table('Kumar_2020_master_gene_table_rnaseq_shrunk_plus_annotations.tsv',sep = "\t",header = T)
tbl <- tbl[!duplicated(tbl$name),]
tbl$sig_Ni_EZH2i_up <- (tbl$RNASeq_DS_EZH2i_vs_Ni_log2FoldChange > 1) & (tbl$RNASeq_DS_EZH2i_vs_Ni_padj < 0.05)
tbl$sig_Ni_EZH2i_down <- (tbl$RNASeq_DS_EZH2i_vs_Ni_log2FoldChange < -1) & (tbl$RNASeq_DS_EZH2i_vs_Ni_padj < 0.05)
tbl$sig_Pr_EZH2i_up <- (tbl$RNASeq_DS_EZH2i_vs_Pr_log2FoldChange > 1) & (tbl$RNASeq_DS_EZH2i_vs_Pr_padj < 0.05)
tbl$sig_Pr_EZH2i_down <- (tbl$RNASeq_DS_EZH2i_vs_Pr_log2FoldChange < -1) & (tbl$RNASeq_DS_EZH2i_vs_Pr_padj < 0.05)
tbl$sig_summary <- "ns"
tbl$sig_summary[tbl$sig_Ni_EZH2i_up] <- "Ni_EZH2i_up"
tbl$sig_summary[tbl$sig_Ni_EZH2i_down] <- "Ni_EZH2i_down"
tbl$sig_summary[tbl$sig_Pr_EZH2i_up] <- "Pr_EZH2i_up"
tbl$sig_summary[tbl$sig_Pr_EZH2i_up] <- "Pr_EZH2i_down"
tbl$sig_summary[tbl$sig_Ni_EZH2i_up & tbl$sig_Pr_EZH2i_up] <- "NP_EZH2i_up"
tbl$sig_summary[tbl$sig_Ni_EZH2i_down & tbl$sig_Pr_EZH2i_down] <- "NP_EZH2i_down"
lanner.set <- select(tbl[tbl$Lanner_germlayer != "None",], c("Lanner_germlayer","sig_summary"))
mdf <- melt(table(lanner.set))
mdf$sig_summary <- as.factor(mdf$sig_summary)
ggbarplot(mdf,x="Lanner_germlayer",y="value",fill="sig_summary", palette= "Paired",orientation="horizontal")

lanner.set <- select(tbl[tbl$Lanner_germlayer != "None",], "Lanner_germlayer","name", contains("mean_cov"))
lanner.set$K4K27ratio_Ni_mean_cov <- log2(lanner.set$H3K4m3_Ni_mean_cov / lanner.set$H3K27m3_Ni_mean_cov)
lanner.set$K4K27ratio_Pr_mean_cov <- log2(lanner.set$H3K4m3_Pr_mean_cov / lanner.set$H3K27m3_Pr_mean_cov)
mdf <- melt(lanner.set)
Using Lanner_germlayer, name as id variables
mdf <- cbind(mdf,colsplit(mdf$variable,"_",c("mark","state","treatment")))
number of columns of result is not a multiple of vector length (arg 511)
mdf$treatment <- gsub(mdf$treatment,pattern = "mean",replacement = "NT")
mdf$sample <- paste0(mdf$state," ",mdf$treatment)
ggstripchart(mdf[mdf$mark=="H3K4m3",],x="sample",y="value",color="sample", facet.by = "Lanner_germlayer")

tbl <- read.table('Kumar_2020_master_gene_table_rnaseq_shrunk_plus_annotations.tsv',sep = "\t",header = T)
tbl <- tbl[!duplicated(tbl$name),]
tbl$K4_EZH2i_up <- (tbl$RNASeq_DS_EZH2i_vs_Ni_log2FoldChange > 0) & (tbl$RNASeq_DS_EZH2i_vs_Ni_padj < 0.05) & (tbl$H3K4m3_Ni_EZH2i_mean_cov/tbl$H3K4m3_Ni_mean_cov > 2)
K4.set <- select(tbl[tbl$K4_EZH2i_up,], "Lanner_germlayer","name", contains("mean_cov"))
mdf <- melt(K4.set)
Using Lanner_germlayer, name as id variables
mdf <- cbind(mdf,colsplit(mdf$variable,"_",c("mark","state","treatment")))
number of columns of result is not a multiple of vector length (arg 344)
mdf$treatment <- gsub(mdf$treatment,pattern = "mean",replacement = "NT")
mdf$sample <- paste0(mdf$state," ",mdf$treatment)
ggstripchart(mdf[mdf$mark=="H3K4m3",],x="sample",y="value",fill="sample", label="name",repel=T)

lanner.set <- select(tbl[tbl$Lanner_germlayer != "None",], "Lanner_germlayer",contains("TPM") & contains("R1") )
mdf <- melt(lanner.set)
Using Lanner_germlayer as id variables
mdf <- cbind(mdf,colsplit(mdf$variable,"_",c("RNASeq","TPM","state","treatment")))
number of columns of result is not a multiple of vector length (arg 511)
mdf$treatment <- gsub(mdf$treatment,pattern = "mean",replacement = "NT")
mdf$sample <- paste0(mdf$state," ",mdf$treatment)
mdf$lg2 <- log2(mdf$value)
ggboxplot(mdf,x="sample",y="lg2",fill="sample", facet.by = "Lanner_germlayer")

ggpaired(lanner.set,cond1="RNASeq_TPM_Ni_R1",cond2="RNASeq_TPM_Ni_EZH2i_R1",facet.by = "Lanner_germlayer",fill = "condition") + scale_y_continuous(trans='log2')

ggsave("pairplot_RNASeq.pdf")
Saving 16 x 16 in image
ggpaired(lanner.set,cond1="RNASeq_TPM_Ni_R1",cond2="RNASeq_TPM_Ni_EZH2i_R1",facet.by = "Lanner_germlayer",fill = "condition") + scale_y_continuous(trans='log2')

ggsave("pairplot_RNASeq.pdf")
Saving 16 x 16 in image
Intermediate population
EZH2i.tbl <- data.frame(name=tbl$name,lfc=tbl$RNASeq_DS_EZH2i_vs_Ni_log2FoldChange)
Messmer_tbl <- read.table("Messmer_CellRep2019_TableS2_IntermediatePop.tsv",header=T, sep="\t")
inter.tbl <- select(Messmer_tbl[Messmer_tbl$P.Value<0.0001 ,],"Gene","vsNaive")
colnames(inter.tbl) <- c("name","lfc")
inter.tbl <- inter.tbl[inter.tbl$name %in% EZH2i.tbl$name,]
inter.tbl <- inter.tbl[order(inter.tbl$lfc),]
#inter.tbl <- rbind(head(inter.tbl,50),tail(inter.tbl,50))
inter.down50 <- head(inter.tbl$name,50)
inter.up50 <- tail(inter.tbl$name,50)
inter.down25 <- head(inter.tbl$name,25)
inter.up25 <- tail(inter.tbl$name,25)
write.table(inter.down25,"Messmer_intermediate_down.top25.txt",sep="\t",quote=F,row.names=F,col.names=F)
write.table(inter.up25,"Messmer_intermediate_up.top25.txt",sep="\t",quote=F,row.names=F,col.names=F)
EZH2i.tbl <- EZH2i.tbl[EZH2i.tbl$name %in% inter.tbl$name,]
EZH2i.tbl$set <- "Ni_EZH2i"
inter.tbl$set <- "Messmer_intermediate"
mdf <- rbind(EZH2i.tbl,inter.tbl)
mdf$lfc <- mdf$lfc
cor.tbl <- cast(mdf,formula = name ~ set, value = "lfc")
ggscatter(cor.tbl <- cast(mdf,formula = name ~ set, value = "lfc")
,x="Ni_EZH2i",y="Messmer_intermediate", size=1, add = "reg.line", conf.int = TRUE) + stat_cor(method = "pearson", label.x = 3) + scale_x_continuous(limits=c(-7,7)) + scale_y_continuous(limits=c(-7,7))

cor.tbl
cor.tbl$quantile <- cut(cor.tbl$Messmer_intermediate, 10, include.lowest=TRUE, labels = seq(1,10))
ggboxplot(cor.tbl,x = "quantile",y="Ni_EZH2i",fill = "quantile")

EZH2i.tbl <- data.frame(name=tbl$name,lfc=tbl$RNASeq_DS_EZH2i_vs_Ni_log2FoldChange)
inter_up.tbl <- EZH2i.tbl[EZH2i.tbl$name %in% inter.up50,]
inter_down.tbl <- EZH2i.tbl[EZH2i.tbl$name %in% inter.down50,]
inter_up.tbl$set <- "Intermediate"
ggscatter(test,x="Ni_EZH2i",y="Messmer_intermediate", size=1, add = "reg.line", conf.int = TRUE) + stat_cor(method = "pearson", label.x = 3)
Error in ggscatter(test, x = "Ni_EZH2i", y = "Messmer_intermediate", size = 1, :
object 'test' not found
inter.set <- select(tbl[tbl$name %in% inter.down50,], "Lanner_germlayer",contains("TPM") & contains("R1"))
mdf <- melt(inter.set)
Using Lanner_germlayer as id variables
mdf <- cbind(mdf,colsplit(mdf$variable,"_",c("RNASeq","TPM","state","treatment")))
number of columns of result is not a multiple of vector length (arg 51)
mdf$treatment <- gsub(mdf$treatment,pattern = "mean",replacement = "NT")
mdf$sample <- paste0(mdf$state," ",mdf$treatment)
mdf$lg2 <- log2(mdf$value)
ggpaired(inter.set,cond1="RNASeq_TPM_Ni_R1",cond2="RNASeq_TPM_Ni_EZH2i_R1",fill = "condition") + scale_y_continuous(trans='log2')

inter.set <- select(tbl[tbl$name %in% inter.up50,], "Lanner_germlayer",contains("TPM") & contains("R1"))
mdf <- melt(inter.set)
Using Lanner_germlayer as id variables
mdf$value <- log2(mdf$value)
mdf <- cbind(mdf,colsplit(mdf$variable,"_",c("RNASeq","TPM","state","treatment")))
number of columns of result is not a multiple of vector length (arg 51)
mdf$treatment <- gsub(mdf$treatment,pattern = "mean",replacement = "NT")
mdf$sample <- paste0(mdf$state," ",mdf$treatment)
mdf$lg2 <- log2(mdf$value)
NaNs produced
ggpaired(inter.set,cond1="RNASeq_TPM_Ni_R1",cond2="RNASeq_TPM_Ni_EZH2i_R1",fill = "condition") + scale_y_continuous(trans='log2')

Messmer_pop <- unlist(read.table(file = "Messmer_intermediate_top500.txt"))
KRT7_genes <- unlist(read.table('Zuchida2020_KRT7pop_genes.txt',sep = "\t",header = F))
inter.set <- select(tbl[tbl$name %in% inter.up25,], "Lanner_germlayer","name",contains("mean_cov"))
inter.set$K4K27ratio_Ni_mean_cov <- log2(inter.set$H3K4m3_Ni_mean_cov / inter.set$H3K27m3_Ni_mean_cov)
inter.set$K4K27ratio_Pr_mean_cov <- log2(inter.set$H3K4m3_Pr_mean_cov / inter.set$H3K27m3_Pr_mean_cov)
mdf <- melt(inter.set)
Using Lanner_germlayer, name as id variables
mdf <- cbind(mdf,colsplit(mdf$variable,"_",c("mark","state","treatment")))
number of columns of result is not a multiple of vector length (arg 26)
mdf$treatment <- gsub(mdf$treatment,pattern = "mean",replacement = "NT")
mdf$sample <- paste0(mdf$state," ",mdf$treatment)
ggstripchart(mdf[mdf$mark=="H3K27m3",],x="sample",y="value",color="sample",label="name",repel=T)


ggstripchart(mdf,x="sample",y="value",fill="sample",add="boxplot",size=0.8,alpha=0.4,facet.by="dir") + scale_y_continuous(trans="log2")

ggsave("Messmer_top50_RNASeq_boxplot.pdf")
Saving 6 x 6 in image
ggstripchart(mdf[mdf$state=="Ni",],x="sample",y="value",fill="sample",add="boxplot",size=0.8,alpha=0.4,facet.by="dir") + scale_y_continuous(trans="log2")

ggsave("Messmer_top50_RNASeq_boxplot_Ni_only.pdf")
Saving 6 x 6 in image
inter.up50 <- unlist(read.table(file = "Messmer_intermediate_up.top50.txt"))
inter.down0 <- unlist(read.table(file = "Messmer_intermediate_down.top50.txt"))
inter.set.up <- select(tbl[tbl$name %in% inter.up50,], "Lanner_germlayer",contains("mean_cov"))
inter.set.down <- select(tbl[tbl$name %in% inter.down50,], "Lanner_germlayer",contains("mean_cov"))
inter.set.up$dir <- "up"
inter.set.down$dir <- "down"
inter.set <- rbind(inter.set.up,inter.set.down)
mdf <- melt(inter.set)
Using Lanner_germlayer, dir as id variables
mdf <- cbind(mdf,colsplit(mdf$variable,"_",c("mark","state","treatment")))
number of columns of result is not a multiple of vector length (arg 101)
mdf$treatment <- gsub(mdf$treatment,pattern = "mean",replacement = "NT")
mdf$sample <- paste0(mdf$state," ",mdf$treatment)
mdf_updown <- mdf
ggpaired(inter.set,cond1="H3K27m3_Ni_mean_cov",cond2="H3K27m3_Pr_mean_cov",fill = "condition", facet.by = "dir")

ggstripchart(mdf[mdf$mark=="H3K27m3",],x="sample",y="value",fill="sample",add="boxplot",size=0.8,alpha=0.4,facet.by="dir")

ggsave("Messmer_top50_H3K27me3_boxplot.pdf")
Saving 6 x 6 in image
ggstripchart(mdf[mdf$mark=="H3K4m3",],x="sample",y="value",fill="sample",add="boxplot",size=0.8,alpha=0.4,facet.by="dir")

ggsave("Messmer_top50_H3K4me3_boxplot.pdf")
Saving 6 x 6 in image
ggstripchart(mdf[mdf$mark=="H2Aub",],x="sample",y="value",fill="sample",add="boxplot",size=0.8,alpha=0.4,facet.by="dir")

ggsave("Messmer_top50_H2Aub_boxplot.pdf")
Saving 6 x 6 in image

Messmer_pop <- unlist(read.table(file = "Messmer_intermediate_up.top50.txt"))
inter.set <- select(tbl[tbl$name %in% inter.down50,], "Lanner_germlayer",contains("mean_cov"))
inter.set$K4K27ratio_Ni_mean_cov <- log2(inter.set$H3K4m3_Ni_mean_cov / inter.set$H3K27m3_Ni_mean_cov)
inter.set$K4K27ratio_Pr_mean_cov <- log2(inter.set$H3K4m3_Pr_mean_cov / inter.set$H3K27m3_Pr_mean_cov)
mdf <- melt(inter.set)
Using Lanner_germlayer as id variables
mdf <- cbind(mdf,colsplit(mdf$variable,"_",c("mark","state","treatment")))
number of columns of result is not a multiple of vector length (arg 51)
mdf$treatment <- gsub(mdf$treatment,pattern = "mean",replacement = "NT")
mdf$sample <- paste0(mdf$state," ",mdf$treatment)
ggpaired(inter.set,cond1="H3K27m3_Ni_mean_cov",cond2="H3K27m3_Pr_mean_cov",fill = "condition")

ggstripchart(mdf[mdf$mark=="H3K27m3",],x="sample",y="value",fill="sample",add="boxplot",size=0.8,alpha=0.4)

ggsave("Messmer_top50down_H3K27me3_boxplot.pdf")
Saving 6 x 6 in image
ggstripchart(mdf[mdf$mark=="H3K4m3",],x="sample",y="value",fill="sample",add="boxplot",size=0.8,alpha=0.4)

ggsave("Messmer_top50down_H3K4me3_boxplot.pdf")
Saving 6 x 6 in image
ggstripchart(mdf[mdf$mark=="H2Aub",],x="sample",y="value",fill="sample",add="boxplot",size=0.8,alpha=0.4)

ggsave("Messmer_top50down_H2Aub_boxplot.pdf")
Saving 6 x 6 in image
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyfQpsaWJyYXJ5KGVsc2Fzc2VybGliKQpsaWJyYXJ5KGdncHVicikKbGlicmFyeShyZXNoYXBlKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncmVwZWwpCmBgYAoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KdGJsIDwtIHJlYWQudGFibGUoJ0t1bWFyXzIwMjBfbWFzdGVyX2dlbmVfdGFibGVfcm5hc2VxX3NocnVua19wbHVzX2Fubm90YXRpb25zLnRzdicsc2VwID0gIlx0IixoZWFkZXIgPSBUKQp0YmwgPC0gdGJsWyFkdXBsaWNhdGVkKHRibCRuYW1lKSxdCgoKdGJsJHNpZ19OaV9FWkgyaV91cCA8LSAodGJsJFJOQVNlcV9EU19FWkgyaV92c19OaV9sb2cyRm9sZENoYW5nZSA+IDApICYgKHRibCRSTkFTZXFfRFNfRVpIMmlfdnNfTmlfcGFkaiA8IDAuMDUpCnRibCRzaWdfTmlfRVpIMmlfZG93biA8LSAodGJsJFJOQVNlcV9EU19FWkgyaV92c19OaV9sb2cyRm9sZENoYW5nZSA8IC0wKSAmICh0YmwkUk5BU2VxX0RTX0VaSDJpX3ZzX05pX3BhZGogPCAwLjA1KQoKdGJsJExhbm5lcl9nZXJtbGF5ZXJbdGJsJG5hbWUgJWluJSBjKCJNU1gyIildIDwtICJFYXJseVRFIgp0YmwkTGFubmVyX2dlcm1sYXllclt0YmwkbmFtZSAlaW4lIGMoIkdBVEEyIiwiR0FUQTMiLCJLUlQ3IiwiWEFHRTIiLCJOVUFLMiIsIkVQQVMxIildIDwtICJURSIKdGJsJExhbm5lcl9nZXJtbGF5ZXJbdGJsJG5hbWUgJWluJSBjKCJWR0xMMSIsIkNHQjUiKV0gPC0gIkNUQiIKdGJsJExhbm5lcl9nZXJtbGF5ZXJbdGJsJG5hbWUgJWluJSBjKCJTTEM0MEExIiwiU0RDMSIsIkNMRE40IildIDwtICJTVEIiCnRibCRzaWdfc3VtbWFyeSA8LSAibnMiCnRibCRzaWdfc3VtbWFyeVt0Ymwkc2lnX05pX0VaSDJpX3VwXSA8LSAiTmlfRVpIMmlfdXAiCnRibCRzaWdfc3VtbWFyeVt0Ymwkc2lnX05pX0VaSDJpX2Rvd25dIDwtICJOaV9FWkgyaV9kb3duIgoKbGFubmVyLnNldCA8LSBzZWxlY3QodGJsW3RibCRMYW5uZXJfZ2VybWxheWVyICE9ICJOb25lIixdLCAibmFtZSIsIkxhbm5lcl9nZXJtbGF5ZXIiLCJzaWdfc3VtbWFyeSIsIGNvbnRhaW5zKCJMb2cyRm9sZENoYW5nZSIpICYgY29udGFpbnMoIlJOQVNlcSIpICkKCmxhbm5lci5zZXQkTGFubmVyX2dlcm1sYXllciA8LSBmYWN0b3IobGFubmVyLnNldCRMYW5uZXJfZ2VybWxheWVyLCBsZXZlbHM9IGMoIkVpZ2h0Q2VsbHMiLCJNb3J1bGEiLCJJQ00iLCJFYXJseUJsYXN0b2N5c3QiLCJFYXJseSIsIkVhcmx5RXBpIiwiRWFybHkvTWlkIEVwaSIsIk1pZEVwaSIsIkxhdGVFcGkiLCJQRSIsIkVhcmx5VEUiLCJURSIsIkxhdGVURSIsIkNUQiIsIlNUQiIsIkVWVCIsIkFtbmlvbiIsIllzTWVzIiwiQXhNZXMiLCJBZHZNZXMiLCJOYXNNZXMiLCJFbU1lcyIsIkVuZG9kZXJtIiwiUHJpUyIpCikKCmdvaSA8LSBjKCJHQVRBMyIsIkdBVEEyIiwiQ0RYMiIsIlRQNjMiLCJDR0EiLCJDR0IiLCJDR0I1IiwiUE9VNUYxIiwiRFBQQTMiLCJWR0xMMSIsIkJNUDQiLCJWSU0iLCJEUFBBMiIsIk5BTk9HIiwiU09YMiIsIktSVDE5IiwiRkdGNCIsIlRGQVAyQSIsIktSVDciLCJFTlBFUCIsIklHRjIiLCJGUlpCIiwiRVJQMjciLCJLUlQyMyIsIkROTVQzQSIsIkROTVQzTCIsIlhBR0UyIiwiSEFORDEiLCJLUlQxOCIsIktMRjYiLCJOVUFLMiIsIkVQQVMxIiwiTVNYMiIsICJTREMxIiwgIlNMQzQwQTEiLCJDTERONCIpCgpnZ3N0cmlwY2hhcnQobGFubmVyLnNldCx4PSJMYW5uZXJfZ2VybWxheWVyIix5PSJSTkFTZXFfRFNfRVpIMmlfdnNfTmlfbG9nMkZvbGRDaGFuZ2UiLCAKICAgICAgICAgICAgIG9yaWVudGF0aW9uPSJob3Jpem9udGFsIiwgCiAgICAgICAgICAgICBjb2xvciA9ICJzaWdfc3VtbWFyeSIsIAogICAgICAgICAgICAgcGFsZXR0ZT1jKCIjODhBQUZGIiwiI0VFODg0NCIsIiNEREREREQiKSwgCiAgICAgICAgICAgICBzaXplID0gMSwgaml0dGVyPTAuMiwKICAgICAgICAgICAgIGdndGhlbWU9dGhlbWVfYncoKSwKICAgICAgICAgICAgIGxhYmVsPSJuYW1lIiwgZm9udC5sYWJlbCA9IGxpc3Qoc2l6ZSA9IDcpLCByZXBlbD1ULCBsYWJlbC5zZWxlY3QgPSBnb2kgLCBsYWJlbC5yZWN0YW5nbGUgPSBGKSArIHNjYWxlX3hfZGlzY3JldGUobGltaXRzPXJldikgIApnZ3NhdmUoImxhbm5lcl9nZXJtbGF5ZXJfbmFpdmVfc3RyaXAucGRmIikKYGBgCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD02fQpnZ3N0cmlwY2hhcnQobGFubmVyLnNldCx4PSJMYW5uZXJfZ2VybWxheWVyIix5PSJSTkFTZXFfRFNfRVpIMmlfdnNfUHJfbG9nMkZvbGRDaGFuZ2UiLCAKICAgICAgICAgICAgIG9yaWVudGF0aW9uPSJob3Jpem9udGFsIiwgCiAgICAgICAgICAgICBjb2xvciA9ICJzaWdfc3VtbWFyeSIsIAogICAgICAgICAgICAgcGFsZXR0ZT1jKCIjODhBQUZGIiwiI0VFODg0NCIsIiNEREREREQiKSwgCiAgICAgICAgICAgICBzaXplID0gMSwgaml0dGVyPTAuMiwKICAgICAgICAgICAgIGdndGhlbWU9dGhlbWVfYncoKSwKICAgICAgICAgICAgIGxhYmVsPSJuYW1lIiwgZm9udC5sYWJlbCA9IGxpc3Qoc2l6ZSA9IDcpLCByZXBlbD1ULCBsYWJlbC5zZWxlY3QgPSBnb2kgLCBsYWJlbC5yZWN0YW5nbGUgPSBGKSArIHNjYWxlX3hfZGlzY3JldGUobGltaXRzPXJldikgIApnZ3NhdmUoImxhbm5lcl9nZXJtbGF5ZXJfcHJpbWVkX3N0cmlwLnBkZiIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9Nn0KZ2dzdHJpcGNoYXJ0KGxhbm5lci5zZXQseD0iTGFubmVyX2dlcm1sYXllciIseT0iUk5BU2VxX0RTX1ByX3ZzX05pX2xvZzJGb2xkQ2hhbmdlIiwgCiAgICAgICAgICAgICBvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIsIAogICAgICAgICAgICAgY29sb3IgPSAic2lnX3N1bW1hcnkiLCAKICAgICAgICAgICAgIHBhbGV0dGU9YygiIzg4QUFGRiIsIiNFRTg4NDQiLCIjREREREREIiksIAogICAgICAgICAgICAgc2l6ZSA9IDEsIGppdHRlcj0wLjIsCiAgICAgICAgICAgICBnZ3RoZW1lPXRoZW1lX2J3KCksCiAgICAgICAgICAgICBsYWJlbD0ibmFtZSIsIGZvbnQubGFiZWwgPSBsaXN0KHNpemUgPSA3KSwgcmVwZWw9VCwgbGFiZWwuc2VsZWN0ID0gZ29pICwgbGFiZWwucmVjdGFuZ2xlID0gRikgKyBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cz1yZXYpICAKZ2dzYXZlKCJsYW5uZXJfZ2VybWxheWVyX25pX3ZzX3ByX3N0cmlwLnBkZiIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9OH0KCgp0YmwgPC0gcmVhZC50YWJsZSgnS3VtYXJfMjAyMF9tYXN0ZXJfZ2VuZV90YWJsZV9ybmFzZXFfc2hydW5rX3BsdXNfYW5ub3RhdGlvbnMudHN2JyxzZXAgPSAiXHQiLGhlYWRlciA9IFQpCnRibCA8LSB0YmxbIWR1cGxpY2F0ZWQodGJsJG5hbWUpLF0KCgp0Ymwkc2lnX05pX0VaSDJpX3VwIDwtICh0YmwkUk5BU2VxX0RTX0VaSDJpX3ZzX05pX2xvZzJGb2xkQ2hhbmdlID4gMSkgJiAodGJsJFJOQVNlcV9EU19FWkgyaV92c19OaV9wYWRqIDwgMC4wNSkKdGJsJHNpZ19OaV9FWkgyaV9kb3duIDwtICh0YmwkUk5BU2VxX0RTX0VaSDJpX3ZzX05pX2xvZzJGb2xkQ2hhbmdlIDwgLTEpICYgKHRibCRSTkFTZXFfRFNfRVpIMmlfdnNfTmlfcGFkaiA8IDAuMDUpCnRibCRzaWdfUHJfRVpIMmlfdXAgPC0gKHRibCRSTkFTZXFfRFNfRVpIMmlfdnNfUHJfbG9nMkZvbGRDaGFuZ2UgPiAxKSAmICh0YmwkUk5BU2VxX0RTX0VaSDJpX3ZzX1ByX3BhZGogPCAwLjA1KQp0Ymwkc2lnX1ByX0VaSDJpX2Rvd24gPC0gKHRibCRSTkFTZXFfRFNfRVpIMmlfdnNfUHJfbG9nMkZvbGRDaGFuZ2UgPCAtMSkgJiAodGJsJFJOQVNlcV9EU19FWkgyaV92c19Qcl9wYWRqIDwgMC4wNSkKCgp0Ymwkc2lnX3N1bW1hcnkgPC0gIm5zIgp0Ymwkc2lnX3N1bW1hcnlbdGJsJHNpZ19OaV9FWkgyaV91cF0gPC0gIk5pX0VaSDJpX3VwIgp0Ymwkc2lnX3N1bW1hcnlbdGJsJHNpZ19OaV9FWkgyaV9kb3duXSA8LSAiTmlfRVpIMmlfZG93biIKdGJsJHNpZ19zdW1tYXJ5W3RibCRzaWdfUHJfRVpIMmlfdXBdIDwtICJQcl9FWkgyaV91cCIKdGJsJHNpZ19zdW1tYXJ5W3RibCRzaWdfUHJfRVpIMmlfdXBdIDwtICJQcl9FWkgyaV9kb3duIgp0Ymwkc2lnX3N1bW1hcnlbdGJsJHNpZ19OaV9FWkgyaV91cCAmIHRibCRzaWdfUHJfRVpIMmlfdXBdIDwtICJOUF9FWkgyaV91cCIKdGJsJHNpZ19zdW1tYXJ5W3RibCRzaWdfTmlfRVpIMmlfZG93biAmIHRibCRzaWdfUHJfRVpIMmlfZG93bl0gPC0gIk5QX0VaSDJpX2Rvd24iCgpsYW5uZXIuc2V0IDwtIHNlbGVjdCh0YmxbdGJsJExhbm5lcl9nZXJtbGF5ZXIgIT0gIk5vbmUiLF0sIGMoIkxhbm5lcl9nZXJtbGF5ZXIiLCJzaWdfc3VtbWFyeSIpKQptZGYgPC0gbWVsdCh0YWJsZShsYW5uZXIuc2V0KSkKCm1kZiRzaWdfc3VtbWFyeSA8LSBhcy5mYWN0b3IobWRmJHNpZ19zdW1tYXJ5KQoKZ2diYXJwbG90KG1kZix4PSJMYW5uZXJfZ2VybWxheWVyIix5PSJ2YWx1ZSIsZmlsbD0ic2lnX3N1bW1hcnkiLCBwYWxldHRlPSAiUGFpcmVkIixvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIpCmBgYApgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD02fQoKbGFubmVyLnNldCA8LSBzZWxlY3QodGJsW3RibCRMYW5uZXJfZ2VybWxheWVyICE9ICJOb25lIixdLCAiTGFubmVyX2dlcm1sYXllciIsIm5hbWUiLCBjb250YWlucygibWVhbl9jb3YiKSkKCmxhbm5lci5zZXQkSzRLMjdyYXRpb19OaV9tZWFuX2NvdiA8LSBsb2cyKGxhbm5lci5zZXQkSDNLNG0zX05pX21lYW5fY292IC8gbGFubmVyLnNldCRIM0syN20zX05pX21lYW5fY292KQpsYW5uZXIuc2V0JEs0SzI3cmF0aW9fUHJfbWVhbl9jb3YgPC0gbG9nMihsYW5uZXIuc2V0JEgzSzRtM19Qcl9tZWFuX2NvdiAvIGxhbm5lci5zZXQkSDNLMjdtM19Qcl9tZWFuX2NvdikKCm1kZiA8LSBtZWx0KGxhbm5lci5zZXQpCgptZGYgPC0gY2JpbmQobWRmLGNvbHNwbGl0KG1kZiR2YXJpYWJsZSwiXyIsYygibWFyayIsInN0YXRlIiwidHJlYXRtZW50IikpKQptZGYkdHJlYXRtZW50IDwtIGdzdWIobWRmJHRyZWF0bWVudCxwYXR0ZXJuID0gIm1lYW4iLHJlcGxhY2VtZW50ID0gIk5UIikgCm1kZiRzYW1wbGUgPC0gcGFzdGUwKG1kZiRzdGF0ZSwiICIsbWRmJHRyZWF0bWVudCkKCmdnc3RyaXBjaGFydChtZGZbbWRmJG1hcms9PSJIM0s0bTMiLF0seD0ic2FtcGxlIix5PSJ2YWx1ZSIsY29sb3I9InNhbXBsZSIsIGZhY2V0LmJ5ID0gIkxhbm5lcl9nZXJtbGF5ZXIiKQpgYGAKCmBgYHtyIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTZ9Cgp0YmwgPC0gcmVhZC50YWJsZSgnS3VtYXJfMjAyMF9tYXN0ZXJfZ2VuZV90YWJsZV9ybmFzZXFfc2hydW5rX3BsdXNfYW5ub3RhdGlvbnMudHN2JyxzZXAgPSAiXHQiLGhlYWRlciA9IFQpCnRibCA8LSB0YmxbIWR1cGxpY2F0ZWQodGJsJG5hbWUpLF0KCnRibCRLNF9FWkgyaV91cCA8LSAodGJsJFJOQVNlcV9EU19FWkgyaV92c19OaV9sb2cyRm9sZENoYW5nZSA+IDApICYgKHRibCRSTkFTZXFfRFNfRVpIMmlfdnNfTmlfcGFkaiA8IDAuMDUpICYgKHRibCRIM0s0bTNfTmlfRVpIMmlfbWVhbl9jb3YvdGJsJEgzSzRtM19OaV9tZWFuX2NvdiA+IDIpCgpLNC5zZXQgPC0gc2VsZWN0KHRibFt0YmwkSzRfRVpIMmlfdXAsXSwgIkxhbm5lcl9nZXJtbGF5ZXIiLCJuYW1lIiwgY29udGFpbnMoIm1lYW5fY292IikpCgptZGYgPC0gbWVsdChLNC5zZXQpCgptZGYgPC0gY2JpbmQobWRmLGNvbHNwbGl0KG1kZiR2YXJpYWJsZSwiXyIsYygibWFyayIsInN0YXRlIiwidHJlYXRtZW50IikpKQptZGYkdHJlYXRtZW50IDwtIGdzdWIobWRmJHRyZWF0bWVudCxwYXR0ZXJuID0gIm1lYW4iLHJlcGxhY2VtZW50ID0gIk5UIikgCm1kZiRzYW1wbGUgPC0gcGFzdGUwKG1kZiRzdGF0ZSwiICIsbWRmJHRyZWF0bWVudCkKCmdnc3RyaXBjaGFydChtZGZbbWRmJG1hcms9PSJIM0s0bTMiLF0seD0ic2FtcGxlIix5PSJ2YWx1ZSIsZmlsbD0ic2FtcGxlIiwgbGFiZWw9Im5hbWUiLHJlcGVsPVQpCmBgYAoKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9Nn0KCmxhbm5lci5zZXQgPC0gc2VsZWN0KHRibFt0YmwkTGFubmVyX2dlcm1sYXllciAhPSAiTm9uZSIsXSwgIkxhbm5lcl9nZXJtbGF5ZXIiLGNvbnRhaW5zKCJUUE0iKSAmIGNvbnRhaW5zKCJSMSIpICkKCm1kZiA8LSBtZWx0KGxhbm5lci5zZXQpCgptZGYgPC0gY2JpbmQobWRmLGNvbHNwbGl0KG1kZiR2YXJpYWJsZSwiXyIsYygiUk5BU2VxIiwiVFBNIiwic3RhdGUiLCJ0cmVhdG1lbnQiKSkpCm1kZiR0cmVhdG1lbnQgPC0gZ3N1YihtZGYkdHJlYXRtZW50LHBhdHRlcm4gPSAibWVhbiIscmVwbGFjZW1lbnQgPSAiTlQiKSAKbWRmJHNhbXBsZSA8LSBwYXN0ZTAobWRmJHN0YXRlLCIgIixtZGYkdHJlYXRtZW50KQptZGYkbGcyIDwtIGxvZzIobWRmJHZhbHVlKQoKZ2dib3hwbG90KG1kZix4PSJzYW1wbGUiLHk9ImxnMiIsZmlsbD0ic2FtcGxlIiwgZmFjZXQuYnkgPSAiTGFubmVyX2dlcm1sYXllciIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9OH0KCmdncGFpcmVkKGxhbm5lci5zZXQsY29uZDE9IlJOQVNlcV9UUE1fTmlfUjEiLGNvbmQyPSJSTkFTZXFfVFBNX05pX0VaSDJpX1IxIixmYWNldC5ieSA9ICJMYW5uZXJfZ2VybWxheWVyIixmaWxsID0gImNvbmRpdGlvbiIpICsgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zPSdsb2cyJykKZ2dzYXZlKCJwYWlycGxvdF9STkFTZXEucGRmIikKYGBgCgpgYGB7ciBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD04fQoKZ2dwYWlyZWQobGFubmVyLnNldCxjb25kMT0iUk5BU2VxX1RQTV9OaV9SMSIsY29uZDI9IlJOQVNlcV9UUE1fTmlfRVpIMmlfUjEiLGZhY2V0LmJ5ID0gIkxhbm5lcl9nZXJtbGF5ZXIiLGZpbGwgPSAiY29uZGl0aW9uIikgKyBzY2FsZV95X2NvbnRpbnVvdXModHJhbnM9J2xvZzInKQpnZ3NhdmUoInBhaXJwbG90X1JOQVNlcS5wZGYiKQpgYGAKCiMjIEludGVybWVkaWF0ZSBwb3B1bGF0aW9uCgpgYGB7ciBmaWcud2lkdGg9NSwgZmlnLmhlaWdodD01fQoKRVpIMmkudGJsIDwtIGRhdGEuZnJhbWUobmFtZT10YmwkbmFtZSxsZmM9dGJsJFJOQVNlcV9EU19FWkgyaV92c19OaV9sb2cyRm9sZENoYW5nZSkKCk1lc3NtZXJfdGJsIDwtIHJlYWQudGFibGUoIk1lc3NtZXJfQ2VsbFJlcDIwMTlfVGFibGVTMl9JbnRlcm1lZGlhdGVQb3AudHN2IixoZWFkZXI9VCwgc2VwPSJcdCIpCmludGVyLnRibCA8LSBzZWxlY3QoTWVzc21lcl90YmxbTWVzc21lcl90YmwkUC5WYWx1ZTwwLjAwMDEgLF0sIkdlbmUiLCJ2c05haXZlIikKY29sbmFtZXMoaW50ZXIudGJsKSA8LSBjKCJuYW1lIiwibGZjIikKCmludGVyLnRibCA8LSBpbnRlci50YmxbaW50ZXIudGJsJG5hbWUgJWluJSBFWkgyaS50YmwkbmFtZSxdCmludGVyLnRibCA8LSBpbnRlci50Ymxbb3JkZXIoaW50ZXIudGJsJGxmYyksXQojaW50ZXIudGJsIDwtIHJiaW5kKGhlYWQoaW50ZXIudGJsLDUwKSx0YWlsKGludGVyLnRibCw1MCkpCgppbnRlci5kb3duNTAgPC0gaGVhZChpbnRlci50YmwkbmFtZSw1MCkKaW50ZXIudXA1MCA8LSB0YWlsKGludGVyLnRibCRuYW1lLDUwKQppbnRlci5kb3duMjUgPC0gaGVhZChpbnRlci50YmwkbmFtZSwyNSkKaW50ZXIudXAyNSA8LSB0YWlsKGludGVyLnRibCRuYW1lLDI1KQoKd3JpdGUudGFibGUoaW50ZXIuZG93bjI1LCJNZXNzbWVyX2ludGVybWVkaWF0ZV9kb3duLnRvcDI1LnR4dCIsc2VwPSJcdCIscXVvdGU9Rixyb3cubmFtZXM9Rixjb2wubmFtZXM9RikKd3JpdGUudGFibGUoaW50ZXIudXAyNSwiTWVzc21lcl9pbnRlcm1lZGlhdGVfdXAudG9wMjUudHh0IixzZXA9Ilx0IixxdW90ZT1GLHJvdy5uYW1lcz1GLGNvbC5uYW1lcz1GKQogCkVaSDJpLnRibCA8LSBFWkgyaS50YmxbRVpIMmkudGJsJG5hbWUgJWluJSBpbnRlci50YmwkbmFtZSxdCgpFWkgyaS50Ymwkc2V0IDwtICJOaV9FWkgyaSIgCmludGVyLnRibCRzZXQgPC0gIk1lc3NtZXJfaW50ZXJtZWRpYXRlIiAKCm1kZiA8LSByYmluZChFWkgyaS50YmwsaW50ZXIudGJsKQptZGYkbGZjIDwtIG1kZiRsZmMKCmNvci50YmwgPC0gY2FzdChtZGYsZm9ybXVsYSA9IG5hbWUgfiBzZXQsIHZhbHVlID0gImxmYyIpCgpnZ3NjYXR0ZXIoY29yLnRibCA8LSBjYXN0KG1kZixmb3JtdWxhID0gbmFtZSB+IHNldCwgdmFsdWUgPSAibGZjIikKLHg9Ik5pX0VaSDJpIix5PSJNZXNzbWVyX2ludGVybWVkaWF0ZSIsIHNpemU9MSwgYWRkID0gInJlZy5saW5lIiwgY29uZi5pbnQgPSBUUlVFKSArICBzdGF0X2NvcihtZXRob2QgPSAicGVhcnNvbiIsIGxhYmVsLnggPSAzKSArIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtNyw3KSkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoLTcsNykpCmBgYAoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KCmNvci50YmwKCmNvci50YmwkcXVhbnRpbGUgPC0gY3V0KGNvci50YmwkTWVzc21lcl9pbnRlcm1lZGlhdGUsIDEwLCBpbmNsdWRlLmxvd2VzdD1UUlVFLCBsYWJlbHMgPSBzZXEoMSwxMCkpCgoKZ2dib3hwbG90KGNvci50YmwseCA9ICJxdWFudGlsZSIseT0iTmlfRVpIMmkiLGZpbGwgPSAicXVhbnRpbGUiKQpgYGAKCgpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQoKRVpIMmkudGJsIDwtIGRhdGEuZnJhbWUobmFtZT10YmwkbmFtZSxsZmM9dGJsJFJOQVNlcV9EU19FWkgyaV92c19OaV9sb2cyRm9sZENoYW5nZSkKaW50ZXJfdXAudGJsIDwtIEVaSDJpLnRibFtFWkgyaS50YmwkbmFtZSAlaW4lIGludGVyLnVwNTAsXQppbnRlcl9kb3duLnRibCA8LSBFWkgyaS50YmxbRVpIMmkudGJsJG5hbWUgJWluJSBpbnRlci5kb3duNTAsXQoKaW50ZXJfdXAudGJsJHNldCA8LSAiSW50ZXJtZWRpYXRlIgoKZ2dzY2F0dGVyKHRlc3QseD0iTmlfRVpIMmkiLHk9Ik1lc3NtZXJfaW50ZXJtZWRpYXRlIiwgc2l6ZT0xLCBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUpICsgIHN0YXRfY29yKG1ldGhvZCA9ICJwZWFyc29uIiwgbGFiZWwueCA9IDMpCmBgYAoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KCmludGVyLnNldCA8LSBzZWxlY3QodGJsW3RibCRuYW1lICVpbiUgaW50ZXIuZG93bjUwLF0sICJMYW5uZXJfZ2VybWxheWVyIixjb250YWlucygiVFBNIikgJiBjb250YWlucygiUjEiKSkKCm1kZiA8LSBtZWx0KGludGVyLnNldCkKCm1kZiA8LSBjYmluZChtZGYsY29sc3BsaXQobWRmJHZhcmlhYmxlLCJfIixjKCJSTkFTZXEiLCJUUE0iLCJzdGF0ZSIsInRyZWF0bWVudCIpKSkKbWRmJHRyZWF0bWVudCA8LSBnc3ViKG1kZiR0cmVhdG1lbnQscGF0dGVybiA9ICJtZWFuIixyZXBsYWNlbWVudCA9ICJOVCIpIAptZGYkc2FtcGxlIDwtIHBhc3RlMChtZGYkc3RhdGUsIiAiLG1kZiR0cmVhdG1lbnQpCm1kZiRsZzIgPC0gbG9nMihtZGYkdmFsdWUpCgpnZ3BhaXJlZChpbnRlci5zZXQsY29uZDE9IlJOQVNlcV9UUE1fTmlfUjEiLGNvbmQyPSJSTkFTZXFfVFBNX05pX0VaSDJpX1IxIixmaWxsID0gImNvbmRpdGlvbiIpICsgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zPSdsb2cyJykKYGBgCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9CgppbnRlci5zZXQgPC0gc2VsZWN0KHRibFt0YmwkbmFtZSAlaW4lIGludGVyLnVwNTAsXSwgIkxhbm5lcl9nZXJtbGF5ZXIiLGNvbnRhaW5zKCJUUE0iKSAmIGNvbnRhaW5zKCJSMSIpKQoKbWRmIDwtIG1lbHQoaW50ZXIuc2V0KQptZGYkdmFsdWUgPC0gbG9nMihtZGYkdmFsdWUpCgptZGYgPC0gY2JpbmQobWRmLGNvbHNwbGl0KG1kZiR2YXJpYWJsZSwiXyIsYygiUk5BU2VxIiwiVFBNIiwic3RhdGUiLCJ0cmVhdG1lbnQiKSkpCm1kZiR0cmVhdG1lbnQgPC0gZ3N1YihtZGYkdHJlYXRtZW50LHBhdHRlcm4gPSAibWVhbiIscmVwbGFjZW1lbnQgPSAiTlQiKSAKbWRmJHNhbXBsZSA8LSBwYXN0ZTAobWRmJHN0YXRlLCIgIixtZGYkdHJlYXRtZW50KQptZGYkbGcyIDwtIGxvZzIobWRmJHZhbHVlKQoKZ2dwYWlyZWQoaW50ZXIuc2V0LGNvbmQxPSJSTkFTZXFfVFBNX05pX1IxIixjb25kMj0iUk5BU2VxX1RQTV9OaV9FWkgyaV9SMSIsZmlsbCA9ICJjb25kaXRpb24iKSArIHNjYWxlX3lfY29udGludW91cyh0cmFucz0nbG9nMicpCmBgYAoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KCk1lc3NtZXJfcG9wIDwtIHVubGlzdChyZWFkLnRhYmxlKGZpbGUgPSAiTWVzc21lcl9pbnRlcm1lZGlhdGVfdG9wNTAwLnR4dCIpKQoKaW50ZXIuc2V0IDwtIHNlbGVjdCh0YmxbdGJsJG5hbWUgJWluJSBNZXNzbWVyX3BvcFsxOjUwXSxdLCAiTGFubmVyX2dlcm1sYXllciIsY29udGFpbnMoIlRQTSIpICYgY29udGFpbnMoIlIxIikpCgptZGYgPC0gbWVsdChpbnRlci5zZXQpCgptZGYgPC0gY2JpbmQobWRmLGNvbHNwbGl0KG1kZiR2YXJpYWJsZSwiXyIsYygiUk5BU2VxIiwiVFBNIiwic3RhdGUiLCJ0cmVhdG1lbnQiKSkpCm1kZiR0cmVhdG1lbnQgPC0gZ3N1YihtZGYkdHJlYXRtZW50LHBhdHRlcm4gPSAibWVhbiIscmVwbGFjZW1lbnQgPSAiTlQiKSAKbWRmJHNhbXBsZSA8LSBwYXN0ZTAobWRmJHN0YXRlLCIgIixtZGYkdHJlYXRtZW50KQptZGYkbGcyIDwtIGxvZzIobWRmJHZhbHVlKQoKZ2dwYWlyZWQoaW50ZXIuc2V0LGNvbmQxPSJSTkFTZXFfVFBNX05pX1IxIixjb25kMj0iUk5BU2VxX1RQTV9OaV9FWkgyaV9SMSIsZmlsbCA9ICJjb25kaXRpb24iKSArIHNjYWxlX3lfY29udGludW91cyh0cmFucz0nbG9nMicpCmBgYAoKYGBge3IgZmlnLndpZHRoPTIsIGZpZy5oZWlnaHQ9Mn0KCmdnc2F2ZSgicGFpcnBsb3RfTWVzc21lcl9pbnRlcm0ucGRmIikKZ2dib3hwbG90KG1kZix4PSJzYW1wbGUiLHk9ImxnMiIsZmlsbD0ic2FtcGxlIikKCmdnc2F2ZSgiYm94cGxvdF9NZXNzbWVyX2ludGVybS5wZGYiKQpgYGAKCmBgYHtyIGZpZy53aWR0aD01LCBmaWcuaGVpZ2h0PTV9CgpNZXNzbWVyX3BvcCA8LSB1bmxpc3QocmVhZC50YWJsZShmaWxlID0gIk1lc3NtZXJfaW50ZXJtZWRpYXRlX3RvcDUwMC50eHQiKSkKS1JUN19nZW5lcyA8LSB1bmxpc3QocmVhZC50YWJsZSgnWnVjaGlkYTIwMjBfS1JUN3BvcF9nZW5lcy50eHQnLHNlcCA9ICJcdCIsaGVhZGVyID0gRikpCgppbnRlci5zZXQgPC0gc2VsZWN0KHRibFt0YmwkbmFtZSAlaW4lIGludGVyLnVwMjUsXSwgIkxhbm5lcl9nZXJtbGF5ZXIiLCJuYW1lIixjb250YWlucygibWVhbl9jb3YiKSkKCmludGVyLnNldCRLNEsyN3JhdGlvX05pX21lYW5fY292IDwtIGxvZzIoaW50ZXIuc2V0JEgzSzRtM19OaV9tZWFuX2NvdiAvIGludGVyLnNldCRIM0syN20zX05pX21lYW5fY292KQppbnRlci5zZXQkSzRLMjdyYXRpb19Qcl9tZWFuX2NvdiA8LSBsb2cyKGludGVyLnNldCRIM0s0bTNfUHJfbWVhbl9jb3YgLyBpbnRlci5zZXQkSDNLMjdtM19Qcl9tZWFuX2NvdikKCm1kZiA8LSBtZWx0KGludGVyLnNldCkKCm1kZiA8LSBjYmluZChtZGYsY29sc3BsaXQobWRmJHZhcmlhYmxlLCJfIixjKCJtYXJrIiwic3RhdGUiLCJ0cmVhdG1lbnQiKSkpCm1kZiR0cmVhdG1lbnQgPC0gZ3N1YihtZGYkdHJlYXRtZW50LHBhdHRlcm4gPSAibWVhbiIscmVwbGFjZW1lbnQgPSAiTlQiKSAKbWRmJHNhbXBsZSA8LSBwYXN0ZTAobWRmJHN0YXRlLCIgIixtZGYkdHJlYXRtZW50KQoKZ2dzdHJpcGNoYXJ0KG1kZlttZGYkbWFyaz09IkgzSzI3bTMiLF0seD0ic2FtcGxlIix5PSJ2YWx1ZSIsY29sb3I9InNhbXBsZSIsbGFiZWw9Im5hbWUiLHJlcGVsPVQpCmBgYAoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KCmludGVyLnVwNTAgPC0gdW5saXN0KHJlYWQudGFibGUoZmlsZSA9ICJNZXNzbWVyX2ludGVybWVkaWF0ZV91cC50b3A1MC50eHQiKSkKaW50ZXIuZG93bjAgPC0gdW5saXN0KHJlYWQudGFibGUoZmlsZSA9ICJNZXNzbWVyX2ludGVybWVkaWF0ZV9kb3duLnRvcDUwLnR4dCIpKQoKaW50ZXIuc2V0LnVwIDwtIHNlbGVjdCh0YmxbdGJsJG5hbWUgJWluJSBpbnRlci51cDUwLF0sICJuYW1lIiwiTGFubmVyX2dlcm1sYXllciIsY29udGFpbnMoIlRQTSIpICYgY29udGFpbnMoIlIxIikpCmludGVyLnNldC5kb3duIDwtIHNlbGVjdCh0YmxbdGJsJG5hbWUgJWluJSBpbnRlci5kb3duNTAsXSwgIm5hbWUiLCJMYW5uZXJfZ2VybWxheWVyIixjb250YWlucygiVFBNIikgJiBjb250YWlucygiUjEiKSkKaW50ZXIuc2V0LnVwJGRpciA8LSAidXAiCmludGVyLnNldC5kb3duJGRpciA8LSAiZG93biIKaW50ZXIuc2V0IDwtIHJiaW5kKGludGVyLnNldC51cCxpbnRlci5zZXQuZG93bikKCm1kZiA8LSBtZWx0KGludGVyLnNldCkKCm1kZiA8LSBjYmluZChtZGYsY29sc3BsaXQobWRmJHZhcmlhYmxlLCJfIixjKCJSTkFTZXEiLCJUUE0iLCJzdGF0ZSIsInRyZWF0bWVudCIpKSkKbWRmJHRyZWF0bWVudCA8LSBnc3ViKG1kZiR0cmVhdG1lbnQscGF0dGVybiA9ICJSMSIscmVwbGFjZW1lbnQgPSAiTlQiKSAKbWRmJHNhbXBsZSA8LSBwYXN0ZTAobWRmJHN0YXRlLCIgIixtZGYkdHJlYXRtZW50KQoKZ2dwYWlyZWQoaW50ZXIuc2V0LGNvbmQxPSJSTkFTZXFfVFBNX05pX1IxIixjb25kMj0iUk5BU2VxX1RQTV9OaV9FWkgyaV9SMSIsZmlsbCA9ICJjb25kaXRpb24iLCBmYWNldC5ieSA9ICJkaXIiLCBsYWJlbD0ibmFtZSIsIGxhYmVsLnNlbGVjdCA9IGMoIkdBVEEzIiwiS1JUMTkiKSkgKyBzY2FsZV95X2NvbnRpbnVvdXModHJhbnM9ImxvZzIiKQpnZ3NhdmUoIk1lc3NtZXJfdG9wNTBfUk5BU2VxX3BhaXJlZF9OaV9vbmx5LnBkZiIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KZ2dzdHJpcGNoYXJ0KG1kZix4PSJzYW1wbGUiLHk9InZhbHVlIixmaWxsPSJzYW1wbGUiLGFkZD0iYm94cGxvdCIsc2l6ZT0wLjgsYWxwaGE9MC40LGZhY2V0LmJ5PSJkaXIiKSAgKyBzY2FsZV95X2NvbnRpbnVvdXModHJhbnM9ImxvZzIiKQpnZ3NhdmUoIk1lc3NtZXJfdG9wNTBfUk5BU2VxX2JveHBsb3QucGRmIikKYGBgCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9Cmdnc3RyaXBjaGFydChtZGZbbWRmJHN0YXRlPT0iTmkiLF0seD0ic2FtcGxlIix5PSJ2YWx1ZSIsZmlsbD0ic2FtcGxlIixhZGQ9ImJveHBsb3QiLHNpemU9MC44LGFscGhhPTAuNCxmYWNldC5ieT0iZGlyIikgICsgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zPSJsb2cyIikKZ2dzYXZlKCJNZXNzbWVyX3RvcDUwX1JOQVNlcV9ib3hwbG90X05pX29ubHkucGRmIikKYGBgCgpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQoKaW50ZXIudXA1MCA8LSB1bmxpc3QocmVhZC50YWJsZShmaWxlID0gIk1lc3NtZXJfaW50ZXJtZWRpYXRlX3VwLnRvcDUwLnR4dCIpKQppbnRlci5kb3duMCA8LSB1bmxpc3QocmVhZC50YWJsZShmaWxlID0gIk1lc3NtZXJfaW50ZXJtZWRpYXRlX2Rvd24udG9wNTAudHh0IikpCgppbnRlci5zZXQudXAgPC0gc2VsZWN0KHRibFt0YmwkbmFtZSAlaW4lIGludGVyLnVwNTAsXSwgIkxhbm5lcl9nZXJtbGF5ZXIiLGNvbnRhaW5zKCJtZWFuX2NvdiIpKQppbnRlci5zZXQuZG93biA8LSBzZWxlY3QodGJsW3RibCRuYW1lICVpbiUgaW50ZXIuZG93bjUwLF0sICJMYW5uZXJfZ2VybWxheWVyIixjb250YWlucygibWVhbl9jb3YiKSkKaW50ZXIuc2V0LnVwJGRpciA8LSAidXAiCmludGVyLnNldC5kb3duJGRpciA8LSAiZG93biIKaW50ZXIuc2V0IDwtIHJiaW5kKGludGVyLnNldC51cCxpbnRlci5zZXQuZG93bikKCm1kZiA8LSBtZWx0KGludGVyLnNldCkKCm1kZiA8LSBjYmluZChtZGYsY29sc3BsaXQobWRmJHZhcmlhYmxlLCJfIixjKCJtYXJrIiwic3RhdGUiLCJ0cmVhdG1lbnQiKSkpCm1kZiR0cmVhdG1lbnQgPC0gZ3N1YihtZGYkdHJlYXRtZW50LHBhdHRlcm4gPSAibWVhbiIscmVwbGFjZW1lbnQgPSAiTlQiKSAKbWRmJHNhbXBsZSA8LSBwYXN0ZTAobWRmJHN0YXRlLCIgIixtZGYkdHJlYXRtZW50KQoKZ2dwYWlyZWQoaW50ZXIuc2V0LGNvbmQxPSJIM0syN20zX05pX21lYW5fY292Iixjb25kMj0iSDNLMjdtM19Qcl9tZWFuX2NvdiIsZmlsbCA9ICJjb25kaXRpb24iLCBmYWNldC5ieSA9ICJkaXIiKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9Cmdnc3RyaXBjaGFydChtZGZbbWRmJG1hcms9PSJIM0syN20zIixdLHg9InNhbXBsZSIseT0idmFsdWUiLGZpbGw9InNhbXBsZSIsYWRkPSJib3hwbG90IixzaXplPTAuOCxhbHBoYT0wLjQsZmFjZXQuYnk9ImRpciIpCmdnc2F2ZSgiTWVzc21lcl90b3A1MF9IM0syN21lM19ib3hwbG90LnBkZiIpCmBgYApgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQpnZ3N0cmlwY2hhcnQobWRmW21kZiRtYXJrPT0iSDNLNG0zIixdLHg9InNhbXBsZSIseT0idmFsdWUiLGZpbGw9InNhbXBsZSIsYWRkPSJib3hwbG90IixzaXplPTAuOCxhbHBoYT0wLjQsZmFjZXQuYnk9ImRpciIpCmdnc2F2ZSgiTWVzc21lcl90b3A1MF9IM0s0bWUzX2JveHBsb3QucGRmIikKYGBgCgpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQpnZ3N0cmlwY2hhcnQobWRmW21kZiRtYXJrPT0iSDJBdWIiLF0seD0ic2FtcGxlIix5PSJ2YWx1ZSIsZmlsbD0ic2FtcGxlIixhZGQ9ImJveHBsb3QiLHNpemU9MC44LGFscGhhPTAuNCxmYWNldC5ieT0iZGlyIikKZ2dzYXZlKCJNZXNzbWVyX3RvcDUwX0gyQXViX2JveHBsb3QucGRmIikKYGBgCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9CgpnZ3NjYXR0ZXIoaW50ZXIuc2V0LHg9IkgzSzI3bTNfTmlfbWVhbl9jb3YiLHk9IkgzSzRtM19OaV9tZWFuX2NvdiIsY29sb3I9ImRpciIsc2l6ZT0wLjgsYWxwaGE9MC40KQpgYGAKCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9CgpNZXNzbWVyX3BvcCA8LSB1bmxpc3QocmVhZC50YWJsZShmaWxlID0gIk1lc3NtZXJfaW50ZXJtZWRpYXRlX3VwLnRvcDUwLnR4dCIpKQoKaW50ZXIuc2V0IDwtIHNlbGVjdCh0YmxbdGJsJG5hbWUgJWluJSBpbnRlci5kb3duNTAsXSwgIkxhbm5lcl9nZXJtbGF5ZXIiLGNvbnRhaW5zKCJtZWFuX2NvdiIpKQoKaW50ZXIuc2V0JEs0SzI3cmF0aW9fTmlfbWVhbl9jb3YgPC0gbG9nMihpbnRlci5zZXQkSDNLNG0zX05pX21lYW5fY292IC8gaW50ZXIuc2V0JEgzSzI3bTNfTmlfbWVhbl9jb3YpCmludGVyLnNldCRLNEsyN3JhdGlvX1ByX21lYW5fY292IDwtIGxvZzIoaW50ZXIuc2V0JEgzSzRtM19Qcl9tZWFuX2NvdiAvIGludGVyLnNldCRIM0syN20zX1ByX21lYW5fY292KQoKbWRmIDwtIG1lbHQoaW50ZXIuc2V0KQoKbWRmIDwtIGNiaW5kKG1kZixjb2xzcGxpdChtZGYkdmFyaWFibGUsIl8iLGMoIm1hcmsiLCJzdGF0ZSIsInRyZWF0bWVudCIpKSkKbWRmJHRyZWF0bWVudCA8LSBnc3ViKG1kZiR0cmVhdG1lbnQscGF0dGVybiA9ICJtZWFuIixyZXBsYWNlbWVudCA9ICJOVCIpIAptZGYkc2FtcGxlIDwtIHBhc3RlMChtZGYkc3RhdGUsIiAiLG1kZiR0cmVhdG1lbnQpCgpnZ3BhaXJlZChpbnRlci5zZXQsY29uZDE9IkgzSzI3bTNfTmlfbWVhbl9jb3YiLGNvbmQyPSJIM0syN20zX1ByX21lYW5fY292IixmaWxsID0gImNvbmRpdGlvbiIpCmBgYApgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQpnZ3N0cmlwY2hhcnQobWRmW21kZiRtYXJrPT0iSDNLMjdtMyIsXSx4PSJzYW1wbGUiLHk9InZhbHVlIixmaWxsPSJzYW1wbGUiLGFkZD0iYm94cGxvdCIsc2l6ZT0wLjgsYWxwaGE9MC40KQpnZ3NhdmUoIk1lc3NtZXJfdG9wNTBkb3duX0gzSzI3bWUzX2JveHBsb3QucGRmIikKYGBgCgpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQpnZ3N0cmlwY2hhcnQobWRmW21kZiRtYXJrPT0iSDNLNG0zIixdLHg9InNhbXBsZSIseT0idmFsdWUiLGZpbGw9InNhbXBsZSIsYWRkPSJib3hwbG90IixzaXplPTAuOCxhbHBoYT0wLjQpCmdnc2F2ZSgiTWVzc21lcl90b3A1MGRvd25fSDNLNG1lM19ib3hwbG90LnBkZiIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9M30KZ2dzdHJpcGNoYXJ0KG1kZlttZGYkbWFyaz09IkgyQXViIixdLHg9InNhbXBsZSIseT0idmFsdWUiLGZpbGw9InNhbXBsZSIsYWRkPSJib3hwbG90IixzaXplPTAuOCxhbHBoYT0wLjQpCmdnc2F2ZSgiTWVzc21lcl90b3A1MGRvd25fSDJBdWJfYm94cGxvdC5wZGYiKQpgYGAKCgpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zfQoKTWVzc21lcl9wb3AgPC0gdW5saXN0KHJlYWQudGFibGUoZmlsZSA9ICJNZXNzbWVyX2ludGVybWVkaWF0ZV90b3A1MDAudHh0IikpCgppbnRlci5zZXQgPC0gc2VsZWN0KHRibFt0YmwkbmFtZSAlaW4lIE1lc3NtZXJfcG9wWzE6NTBdLF0sICJMYW5uZXJfZ2VybWxheWVyIixjb250YWlucygiVFBNIikgJiBjb250YWlucygiUjEiKSkKCm1kZiA8LSBtZWx0KGludGVyLnNldCkKCm1kZiA8LSBjYmluZChtZGYsY29sc3BsaXQobWRmJHZhcmlhYmxlLCJfIixjKCJSTkFTZXEiLCJUUE0iLCJzdGF0ZSIsInRyZWF0bWVudCIpKSkKbWRmJHRyZWF0bWVudCA8LSBnc3ViKG1kZiR0cmVhdG1lbnQscGF0dGVybiA9ICJtZWFuIixyZXBsYWNlbWVudCA9ICJOVCIpIAptZGYkc2FtcGxlIDwtIHBhc3RlMChtZGYkc3RhdGUsIiAiLG1kZiR0cmVhdG1lbnQpCm1kZiRsZzIgPC0gbG9nMihtZGYkdmFsdWUpCgpnZ3BhaXJlZChpbnRlci5zZXQsY29uZDE9IlJOQVNlcV9UUE1fTmlfUjEiLGNvbmQyPSJSTkFTZXFfVFBNX05pX0VaSDJpX1IxIixmaWxsID0gImNvbmRpdGlvbiIpICsgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zPSdsb2cyJykKYGBg